import { reqUserLogin } from '@/api/login'
import type { LoginData } from '@/api/login/type'
import { GET_TOKEN, REMOVE_TOKEN, SET_TOKEN } from '@/utils/toke'
import { GET_USER, REMOVE_USER, SET_USER } from '@/utils/user'
import { defineStore } from 'pinia'
import { ref } from 'vue'
// 引入路由器对象
import router from '@/router'

// 用户相关的仓库
const useUserStore = defineStore(
  'user',
  () => {
    // 用于控制登录对话框组件的显示与隐藏
    const showLogin = ref(false)
    // 存储用户名
    const userName = ref((GET_USER() as string) || '')
    // 存储用户的token
    const token = ref((GET_TOKEN() as string) || '')

    // 登录请求
    const userLogin = async (data: LoginData) => {
      let result = await reqUserLogin(data)
      if (result.code === 200) {
        // 存储用户信息
        userName.value = result.data.name
        token.value = result.data.token
        // 持久化存储用户名和token
        SET_USER(userName.value)
        SET_TOKEN(token.value)
        // 登录成功返回一个成功的promise
        return 'ok'
      } else {
        // 登录失败返回一个失败的promise
        return Promise.reject(new Error(result.message))
      }
    }
    // 退出登录
    const userLogOut = () => {
      // 清空仓库和本地的数据
      ;(token.value = ''), (userName.value = ''), REMOVE_USER()
      REMOVE_TOKEN()
      // 路由跳转到首页
      router.push({
        path: '/',
      })
    }
    // 查询微信扫码的结果(查看本地存储是否存储数据)
    const queryState = () => {
      // 开启定时器每隔一秒：查看本地存储是否拥有用户信息
      let timer = setInterval(() => {
        // 本地存储有用户数据
        if (GET_TOKEN()) {
          // 存储用户数据
          userName.value = GET_USER() as string
          token.value = GET_TOKEN() as string
          // 关闭对话框
          showLogin.value = false
          // 关闭定时器
          clearInterval(timer)
        }
      }, 1000)
    }
    // 将仓库中的数据/方法暴露出去
    return {
      showLogin,
      userName,
      token,
      userLogin,
      userLogOut,
      queryState,
    }
  },
  {
    persist: true,
  },
)

// 对外暴露仓库
export default useUserStore
